/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import model.Disciplina;
import model.Curso;
import java.util.ArrayList;
import javax.persistence.*;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author Rúiter
 */
public class Main {

    private static final String PERSISTENCE_UNIT_NAME = "ea975entradaPU";
    private static final int NUMERO_PAGINAS_DISCIPLINAS = 76;
    private static EntityManagerFactory factory;
    /**
     * @param args the command line arguments
     */
    @PersistenceContext
    EntityManager em;

    public static void main(String[] args) {

        // Create the EntityManagerFactory
        factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);



        //******INICIO Extracao Disciplinas com Codigo Nome Prereqs

        Extraction eDisc = new Extraction();
        ArrayList<Disciplina> listDisc = new ArrayList<>();

        //String Usadas Extracao das Disciplinas
        String url1eDisc = "http://www.dac.unicamp.br/sistemas/catalogos/grad/catalogo2014/coordenadorias/00";
        String url2eDisc = "/00";
        String urlhtml = ".html";
        
        //Executa a extração para todas as páginas de disciplinas da UNICAMP
        for (int i = 1; i < NUMERO_PAGINAS_DISCIPLINAS; i++) {
            if (i < 10) {
                listDisc = eDisc.extract(url1eDisc + "0" + i + url2eDisc + "0" + i + urlhtml);

            } else {
                try {
                    listDisc = eDisc.extract(url1eDisc + i + url2eDisc + i + urlhtml);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }

        //Salva no banco de dados as disciplinas extraidas

        for (int j = 0; j < listDisc.size(); j++) {
            if (listDisc.get(j) != null) {
                Disciplina d = new Disciplina();
                d.setCodigo(listDisc.get(j).getCodigo());
                d.setNome(listDisc.get(j).getNome());
                d.setOferecimento(listDisc.get(j).getOferecimento());
                d.setPrereqString(listDisc.get(j).getPrereqString());

                EntityManager em = factory.createEntityManager();

                List<Disciplina> result =
                        em.createNamedQuery
                        ("Disciplina.findByCodigo", Disciplina.class)
                        .setParameter("codigo", d.getCodigo())
                        .getResultList();

                if (result.isEmpty()) {

                    em.getTransaction().begin();
//                d.setPrereqs(getPrereqsPersistentes(d, em));
                    em.persist(d);
                    em.getTransaction().commit();

                } else {

                    em.getTransaction().begin();

                    Disciplina disciplinaBanco = result.get(0);
                    if (!disciplinaBanco.getNome().equals(d.getNome())) {
                        disciplinaBanco.setNome(d.getNome());
                    }
                    if (!disciplinaBanco.getPrereqString().equals(d.getPrereqString())) {
                        disciplinaBanco.setPrereqString(d.getPrereqString());
                    }
                    if (disciplinaBanco.getOferecimento() != d.getOferecimento()) {
                        disciplinaBanco.setOferecimento(d.getOferecimento());
                    }
                    em.getTransaction().commit();
                }
                em.close();
            }
        }
        
        //******FIM Extracao Disciplinas com Codigo Nome Prereqs
        
        //******INICIO Extracao Oferecimento Disciplinas 

        ExtractionDiscOferecGeral eOfer = new ExtractionDiscOferecGeral();
        ArrayList<Disciplina> listOfer = new ArrayList<>();

        String url1eOfer = "http://www.dac.unicamp.br/sistemas/horarios/grad/G1S0/";
        String[] url2eOfer = {"CEL", "FCA", "FCM", "FE", "FEA", "FEAGRI", "FEC", "FEEC", "FEF", "FEM", "FENF",
            "FEQ", "FOP", "FT", "IA", "IB", "IC", "IE", "IEL", "IFCH", "IFGW", "IG", "IMECC", "IQ", "REIT"};
        String urlhtm = ".htm";
        for (int i = 0; i < 25; i++) {
            String aux = url1eOfer + url2eOfer[i] + urlhtm;
            listOfer = eOfer.extractDiscOferecGeral(aux);
        }

            for (int j = 0; j < listOfer.size(); j++) {
                if (listOfer.get(j) != null) {
                    Disciplina d2 = new Disciplina();
                    d2.setCodigo(listOfer.get(j).getCodigo());
                    d2.setNome(listOfer.get(j).getNome());
                    d2.setOferecimento(listOfer.get(j).getOferecimento());

                    EntityManager em2 = factory.createEntityManager();

                ArrayList<Disciplina> result = em.createNamedQuery
                        ("Disciplina.findByCodigo", Disciplina.class)
                        .setParameter("codigo", d.getCodigo())
                        .getResultList();

                if (!result.isEmpty()) {

                    if (!result2.isEmpty()) {

                        em2.getTransaction().begin();
                        Disciplina disciplinaBanco = result2.get(0);
                        if (disciplinaBanco.getOferecimento() != d2.getOferecimento()) {
                            disciplinaBanco.setOferecimento(d2.getOferecimento());

                        }
                        em2.getTransaction().commit();
                    }

                    em.close();
                }

            }

        }

        //******FIM Extracao Oferecimento Disciplinas 
        //******INICIO Extracao Cursos

        ExtractionCursos eCurso = new ExtractionCursos();
        ArrayList<Curso> listCurso = new ArrayList<>();
        listCurso = eCurso.extractCursos();

        for (int j = 0; j < listCurso.size(); j++) {
            if (listCurso.get(j) != null) {
                Curso c = new Curso();
                c.setCodigo(listCurso.get(j).getCodigo());
                c.setNome(listCurso.get(j).getNome());
                c.setPeriodo(listCurso.get(j).getPeriodo());

            for (int j = 0; j < listCurso.size(); j++) {
                if (listCurso.get(j) != null) {
                    Curso c = new Curso();
                    c.setCodigo(listCurso.get(j).getCodigo());
                    c.setNome(listCurso.get(j).getNome());
                    c.setPeriodo(listCurso.get(j).getPeriodo());

                    EntityManager em3 = factory.createEntityManager();

                    List<Curso> resultado = em3.createNamedQuery("Curso.findByCodigo", Curso.class)
                            .setParameter("codigo", c.getCodigo())
                            .getResultList();

                    if (resultado.isEmpty()) {
                        em.getTransaction().begin();
                        em.persist(c);
                        em.getTransaction().commit();
                    }

                } else {
                    em.getTransaction().begin();

                    Curso cursoBanco = result.get(0);
                    if (!cursoBanco.getNome().equals(c.getNome())) {
                        cursoBanco.setNome(c.getNome());
                    }
                    if (!cursoBanco.getPeriodo().equals(c.getPeriodo())) {
                        cursoBanco.setPeriodo(c.getPeriodo());
                    }
                    em.getTransaction().commit();
                    em.close();

                }

            }

        }
//        }
        //******FIM Extracao Cursos 

    }
}
